package test15;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 3. 定义一个标准的JavaBean，名叫Person，包含属性name、age。
 使用反射的方式创建一个实例、调用构造函数初始化name、age，使用反射方式调用setName方法对名称进行设置，
 不使用setAge方法直接使用反射方式对age赋值。
 */
public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class clazz = Class.forName("test15.Person");

//        Person person = (Person) clazz.newInstance();
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        constructor.setAccessible(true);
        Person p1 = (Person) constructor.newInstance("张三", 13);
        System.out.println("反射修改前：" + p1);
        Method setName = clazz.getDeclaredMethod("setName", String.class);
        setName.setAccessible(true);
        setName.invoke(p1,"李四");

        Method setAge = clazz.getDeclaredMethod("setAge", int.class);
        setAge.setAccessible(true);
        setAge.invoke(p1,333);

        System.out.println("反射修改后："+p1);
    }
}
